小编joh*_*nMa的帖子

使用loadNibNamed时所有者的含义是什么?

Apple Doc说nib文件中最重要的对象之一是File的Owner对象,但它似乎是nib文件中的File所有者,而不是LoadNibName方法设置的那个.我想知道它们之间的区别是什么?

这是一个例子:

我从xib自定义alertView并提供如下静态类方法:

+(CustomAlert *)sharedAlert{
    CustomAlert *alert = [[[NSBundle mainBundle] loadNibNamed:@"CustomAlert" owner:nil options:nil]lastObject];
    return alert;
}
Run Code Online (Sandbox Code Playgroud)

我有一种方法在视图上显示警报

- (void)showInView:(UIView *)view{
    [view addSubview:self];
}
Run Code Online (Sandbox Code Playgroud)

在我的viewController中:

- (IBAction)buttonPressed:(id)sender{
    CustomAlert *alert = [CustomAlert sharedAlert];
    [alert showInView:self.view];
}
Run Code Online (Sandbox Code Playgroud)

它适用于我的情况,所以有必要设置所有者[[[NSBundle mainBundle] loadNibNamed: owner: options:吗?

objective-c ios loadnibnamed

5
推荐指数
1
解决办法
862
查看次数

jni调用java方法,该方法将自定义java接口作为参数

我正在上的cocos2d-X平台的插件项目,我想编写C++封装接口,通过调用Java方法JNIjarSDK.我知道如何使用JNI来调用静态java方法,但我对java函数中的interface参数感到困惑.我有一个处理回调的cpp函数指针:

typedef void (* MyCallback)(int responseCode, string arg1, set<string> arg2);
Run Code Online (Sandbox Code Playgroud)

我想写一个cpp包装器方法,如:

static void MyCpp::setTags(set<string> tags, MyCallback callback) //it use `JNI` to invoke java method setTags(Context context, Set<String> tags, TagCallback callback).
Run Code Online (Sandbox Code Playgroud)

我想在包装器中调用的java方法是

public static void setTags(Context context, Set<String> tags, TagCallback callback)
Run Code Online (Sandbox Code Playgroud)

并且TagCallback是API用户实现的接口.那么,是否有可能TagCallback最终回调MyCallback函数?换句话说,我可以使用jni将cpp函数指针转换为java接口吗?谢谢你的耐心 .

编辑:setTag如果用户只想使用java, 这里是如何使用:

public static void setTags(context, tags, new TagCallback{
    @Override
    public void callback(int arg0, String arg1, Set<String> arg2) {
            // TODO Auto-generated method stub …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface android cocos2d-x

5
推荐指数
1
解决办法
3953
查看次数

CoreData和线程安全

我有一个单身名称CoreDataManager注册mergeContextChangesForNotification在其中:

+ (id) sharedManager{
    static CoreDataManager *mSharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        mSharedManager = [[CoreDataManager alloc] init];
    });
    return mSharedManager;
}

- (id)init
{
    self = [super init];
    if (self) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(mergeContextChangesForNotification:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:nil];
        });
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我收到通知后:

- (void)mergeContextChangesForNotification:(NSNotification *)notification {
        [shareContext  performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                                        withObject:notification 
                                     waitUntilDone:YES];
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 我应该performSelectorOnMainThread在这里使用吗?因为这个答案说永远不会.我应该把它改成GCD并使用dispatch_get_main_queue??
  2. 注册mergeContextChangesForNotificationin init是否是一种很好的做法,以确保通知始终在主线程中注册?我从这个答案中读到了

singleton core-data thread-safety ios

3
推荐指数
1
解决办法
4182
查看次数

向导航栏添加刷新按钮

大家好我很痛苦的时候试图让这个导航栏包含一个刷新按钮,如果你可以看看下面的代码,然后提供一些帮助这是我的原始代码以及我发现刷新的UIBarbutton片段谷歌上另一个用户项目的按钮.我遇到了以下错误:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView setBackgroundView:nil];
    self.tableView.backgroundColor = [ColorHelper charcoalBackgroundImage];
    UIBarButtonItem *refresh = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
    self.navigationItem.leftBarButtonItem = refresh;
    // [button release]; remove this line if you're using ARC
}
- (void) refresh
{

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
Run Code Online (Sandbox Code Playgroud)

iphone objective-c uitableview ios

2
推荐指数
1
解决办法
4560
查看次数

如何通过Ndk-build静态构建可执行文件?

我正在尝试构建一个可在Windows中静态链接android系统库的可执行文件,我使用以下命令:

%NDK_PATH%\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin\arm-linux-androideabi-gcc.exe jni\main.c -o main --sysroot=%NDK_PATH%\platforms\android-9\arch-arm -static 
Run Code Online (Sandbox Code Playgroud)

有时可能需要添加选项:

 -static-libgcc -static-libstdc++ -std=gnu99
Run Code Online (Sandbox Code Playgroud)

构建后输出文件是我想要的.
但是,如果我想构建可执行文件,请使用jni\Android.mkjni\Application.mk通过ndk-build,该选项:

-static -static-libgcc -static-libstdc++ -std=gnu99
Run Code Online (Sandbox Code Playgroud)

我应该追加,我应该选择哪个.mk文件?
我尝试添加:

LOCAL_CFLAGS := -static
Run Code Online (Sandbox Code Playgroud)

进入jni\Andorid.mk,但输出没有改变.

如何解决.mk问题?

static android gcc android-ndk ndk-build

1
推荐指数
1
解决办法
3570
查看次数