Search code examples
iosobjective-cxcodetitanium-mobileappcelerator-titanium

Use of undeclared identified variable


I have been trying my hands for the first time building a native iOS module to be consumed for a Titanium app from the official appcelerator docs:iOS Module Quick Start. Not sure why the build fails as

'/iphone/Classes/ComExampleTestModule.m:55:20: Use of undeclared identifier 'foo'; did you mean 'for'? 

I notice this error for the dealloc and setExampleProp where i use the foo variable in the ComExampleTestModule.m file.

ComExampleTestModule.h

#import "TiModule.h"

@interface ComExampleTestModule : TiModule
{
}

@end

@interface ComAppcNewmoduleModule : TiModule
{
    NSString *foo;
}
@end

ComExampleTestModule.m

/**


* test
 *
 * Created by Your Name
 * Copyright (c) 2017 Your Company. All rights reserved.
 */

#import "ComExampleTestModule.h"
#import "TiBase.h"
#import "TiHost.h"
#import "TiUtils.h"

@implementation ComExampleTestModule

#pragma mark Internal

// this is generated for your module, please do not change it
-(id)moduleGUID
{
    return @"e5d1b415-6588-4911-9825-3a210032b430";
}

// this is generated for your module, please do not change it
-(NSString*)moduleId
{
    return @"com.example.test";
}

#pragma mark Lifecycle

-(void)startup
{
    // this method is called when the module is first loaded
    // you *must* call the superclass
    [super startup];

    NSLog(@"[INFO] %@ loaded",self);
}

-(void)shutdown:(id)sender
{
    // this method is called when the module is being unloaded
    // typically this is during shutdown. make sure you don't do too
    // much processing here or the app will be quit forceably

    // you *must* call the superclass
    [super shutdown:sender];
}

#pragma mark Cleanup

-(void)dealloc
{
    // release any resources that have been retained by the module
    RELEASE_TO_NIL(foo); // Errors out on this line
    [super dealloc];
}

#pragma mark Internal Memory Management

-(void)didReceiveMemoryWarning:(NSNotification*)notification
{
    // optionally release any resources that can be dynamically
    // reloaded once memory is available - such as caches
    [super didReceiveMemoryWarning:notification];
}

#pragma mark Listener Notifications

-(void)_listenerAdded:(NSString *)type count:(int)count
{
    if (count == 1 && [type isEqualToString:@"my_event"])
    {
        // the first (of potentially many) listener is being added
        // for event named 'my_event'
    }
}

-(void)_listenerRemoved:(NSString *)type count:(int)count
{
    if (count == 0 && [type isEqualToString:@"my_event"])
    {
        // the last listener called for event named 'my_event' has
        // been removed, we can optionally clean up any resources
        // since no body is listening at this point for that event
    }
}

#pragma Public APIs

-(id)example:(id)args
{

    return @"hello world";
}

-(id)exampleProp:(id)foo
{
    NSLog(@"[INFO] In Module - the stored value for exampleProp: %@", foo);
    return foo;
}

-(void)setExampleProp:(id)value
{
    // Macro from TiBase.h to type check the data
    ENSURE_STRING(value);
    // Call the retain method to keep a reference to the passed value
    foo = [value retain]; // Errors out on this line
    NSLog(@"[INFO] In Module - the new value for exampleProp: %@", value);
}

@end

Solution

  • foo is a member of ComAppcNewmoduleModule, not ComExampleTestModule. But you try to access it in ComExampleTestModule (@implementation ComExampleTestModule).
    That's why you are getting the error., because ComExampleTestModule doesn't know foo.